What is the difference between a class and a module?
類別(Class)與模組(Module)的差異在哪裡?
在第三天我們有提到物件中類別的概念,今日就來探討一下類別與另一個名詞模組之間的關係。
先簡單複習一下類別(Class)的概念,類別就像是建立物件的藍圖(blueprint),裡面定義了物件的狀態以及物件可以做的行為。而類別可以產生實體(Instance),也就是我們所說的物件。
而模組又是什麼呢?
模組跟類別其實很像,差別在於模組不能被繼承與產生實體。下面看看模組的寫法。
module Piano
def play_piano
puts "I can play the piano!"
end
end
以module開頭,裡面定義play_piano
方法。
class Human
include Piano
end
John = Human.new
John.play_piano # => I can play the piano!
在Human
類別裡面我們並沒有定義play_piano
方法,但藉由include
Piano
這個模組就可以使play_piano
方法,John就因此學會彈鋼琴了!
其實Class
類別是繼承自Module
類別!在irb的模式中對類別使用superclass
這個方法就可以找出它是繼承之哪一個類別。
Class.superclass # => Module
由下面這種方式,可以Class與Module的差別,類別方法並沒有不同,而差別在於allocate
new
superclass
三個實體方法,new
allocate
與產生實體有關,而superclass
與繼承有關。
所以Module與Class最大的差別就在於,Module無法使用new
或 allocate
產生實體,也沒有辦法繼承或被繼承別的類別或模組。
Class.methods - Module.methods
# => []
Class.instance_methods - Module.instance_methods
# => [:allocate, :superclass, :new]
Class
類別是繼承自Module
類別,差別在於: